using Os.Infra;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;

namespace Os.Domain
{
	public class TipoAtendimento
	{
		private int _idTipoAtendimento;
		private string _nome;
		private bool _persisted;
		private bool _modified;

        private const string SPSELECTID = "SP_TipoAtendimentoSelId";
        private const string SPSELECT = "SP_TipoAtendimentoSel";
        private const string SPINSERT = "SP_TipoAtendimentoIns";
        private const string SPUPDATE = "SP_TipoAtendimentoUpd";
        private const string SPDELETE = "SP_TipoAtendimentoDel";

		public int IdTipoAtendimento
		{
			get
			{
				return this._idTipoAtendimento;
			}
			set
			{
				this._idTipoAtendimento = value;
				this._modified = true;
			}
		}
		public string Nome
		{
			get
			{
				return this._nome;
			}
			set
			{
				this._nome = value;
				this._modified = true;
			}
		}
		public TipoAtendimento()
		{
		}
		public TipoAtendimento(int idTipoAtendimento)
		{
			this._idTipoAtendimento = idTipoAtendimento;
			this._persisted = true;
		}
		private List<MySqlParameter> ObterParametros()
		{
			return new List<MySqlParameter>
			{
				new MySqlParameter("?idTipoAtendimento", MySqlDbType.Int32, 11), 
				new MySqlParameter("?nome", MySqlDbType.VarChar, 50)
			};
		}
		private void PreencherParametros(List<MySqlParameter> parms)
		{
			parms[0].Value = this._idTipoAtendimento;
			parms[1].Value = this._nome;
			if (!this._persisted)
			{
				parms[0].Direction = ParameterDirection.Output;
			}
			else
			{
				parms[0].Direction = ParameterDirection.Input;
			}
		}
		private void Inserir()
		{
			List<MySqlParameter> parameters = this.ObterParametros();
			this.PreencherParametros(parameters);
			using (MySqlConnection mySqlConnection = new MySqlConnection(MysqlData.CONN_STRING))
			{
				mySqlConnection.Open();
				try
				{
					MySqlCommand mySqlCommand = MysqlData.ExecutarComando(CommandType.StoredProcedure, "SP_TipoAtendimentoIns", parameters);
					this._idTipoAtendimento = Convert.ToInt32(mySqlCommand.Parameters["?id_TipoAtendimento"].Value);
					mySqlCommand.Parameters.Clear();
					this._persisted = true;
					this._modified = false;
				}
				catch (Exception ex)
				{
					throw ex;
				}
			}
		}
		private void Inserir(MySqlTransaction trans)
		{
			List<MySqlParameter> parameters = this.ObterParametros();
			this.PreencherParametros(parameters);
			MySqlCommand mySqlCommand = MysqlData.ExecutarComando(trans, CommandType.StoredProcedure, "SP_TipoAtendimentoIns", parameters);
			this._idTipoAtendimento = Convert.ToInt32(mySqlCommand.Parameters["?parIdTipoAtendimento"].Value);
			mySqlCommand.Parameters.Clear();
			this._persisted = true;
			this._modified = false;
		}
		private void Atualizar()
		{
			if (this._modified)
			{
				List<MySqlParameter> parameters = this.ObterParametros();
				this.PreencherParametros(parameters);
				MysqlData.ExecutarComando(CommandType.StoredProcedure, "SP_TipoAtendimentoUpd", parameters);
				this._modified = false;
			}
		}
		private void Atualizar(MySqlTransaction trans)
		{
			if (this._modified)
			{
				List<MySqlParameter> parameters = this.ObterParametros();
				this.PreencherParametros(parameters);
				MysqlData.ExecutarComando(trans, CommandType.StoredProcedure, "SP_TipoAtendimentoUpd", parameters);
				this._modified = false;
			}
		}
		public static void Remover(int idTipoAtendimento)
		{
			List<MySqlParameter> parms = new List<MySqlParameter>
			{
				new MySqlParameter("?parIdTipoAtendimento", MySqlDbType.Int32, 11)
			};
			parms[0].Value = idTipoAtendimento;
			MysqlData.ExecutarComando(CommandType.StoredProcedure, "SP_TipoAtendimentoDel", parms);
		}
		public static void Remover(MySqlTransaction trans, int idTipoAtendimento)
		{
			List<MySqlParameter> parms = new List<MySqlParameter>
			{
				new MySqlParameter("?parIdTipoAtendimento", MySqlDbType.Int32, 11)
			};
			parms[0].Value = idTipoAtendimento;
			MySqlCommand mySqlCommand = MysqlData.ExecutarComando(trans, CommandType.StoredProcedure, "SP_TipoAtendimentoDel", parms);
			mySqlCommand.Parameters.Clear();
		}
		public void Salvar()
		{
			if (!this._persisted)
			{
				this.Inserir();
			}
			else
			{
				this.Atualizar();
			}
		}
		public void Salvar(MySqlTransaction trans)
		{
			if (!this._persisted)
			{
				this.Inserir(trans);
			}
			else
			{
				this.Atualizar(trans);
			}
		}
		private static void RealizarPersistencia(IDataReader dado, TipoAtendimento objTipoAtendimento)
		{
			try
			{
                if (dado["idTipoAtendimento"] != DBNull.Value)
				    objTipoAtendimento._idTipoAtendimento = Convert.ToInt32(dado["idTipoAtendimento"]);
                if (dado["nome"] != DBNull.Value)
				    objTipoAtendimento._nome = Convert.ToString(dado["nome"]);

				objTipoAtendimento._persisted = true;
				objTipoAtendimento._modified = false;
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		public static TipoAtendimento CarregarObjeto(int idTipoAtendimento)
		{
			TipoAtendimento tipo = null;
			using (IDataReader dado = TipoAtendimento.CarregarDadosBanco(idTipoAtendimento))
			{
				tipo = new TipoAtendimento();
                if (dado.Read())
                {
                    TipoAtendimento.RealizarPersistencia(dado, tipo);
                }
                dado.Close();
                dado.Dispose();
			}
			return tipo;
		}
		public static List<TipoAtendimento> CarregarTodos()
		{
			List<TipoAtendimento> tipos = new List<TipoAtendimento>();
			using (IDataReader dado = TipoAtendimento.CarregarDadosBanco())
			{
				while (dado.Read())
				{
					TipoAtendimento objTipo = new TipoAtendimento();
                    TipoAtendimento.RealizarPersistencia(dado, objTipo);
                    tipos.Add(objTipo);
				}
                dado.Close();
                dado.Dispose();
			}
            return tipos;
		}
		public void CompletarObjeto()
		{
			using (IDataReader dado = TipoAtendimento.CarregarDadosBanco(this._idTipoAtendimento))
			{
				if (dado.Read())
				{
					TipoAtendimento.RealizarPersistencia(dado, this);
				}
                dado.Close();
                dado.Dispose();
			}
		}
		private static IDataReader CarregarDadosBanco(int idTipoAtendimento)
		{
			List<MySqlParameter> parms = new List<MySqlParameter>
			{
				new MySqlParameter("?idTipoAtendimento", MySqlDbType.Int32, 11)
			};
			parms[0].Value = idTipoAtendimento;
			return MysqlData.ExecutarLeitura(CommandType.StoredProcedure, "SP_TipoAtendimentoSelId", parms);
		}
		private static IDataReader CarregarDadosBanco()
		{
			List<MySqlParameter> parms = new List<MySqlParameter>();
			return MysqlData.ExecutarLeitura(CommandType.StoredProcedure, "SP_TipoAtendimentoSel", null);
		}
	}
}
